%define @DATA _DATA
%macro .MODEL 1
%define %1
%endmacro
%macro .CODE 0
%ifdef TINY ;se definido modele TINY (PROGRAMA .COM)
group dgroup _TEXT _DATA
segment _TEXT class=CODE align=16
resb 0x100
..start:
%elifdef SMALL ;senao, se definido modelo SMALL (PROGRAMA .EXE)
..start:
mov ax, _STACK
mov ss, ax
mov sp, TOPO_DA_PILHA
%else
%error Voce deve definir um modelo de memoria
%endif
%endmacro
%macro .STACK 1
%ifdef TINY
%error Perigo:O modelo TINY nao usa segmento de Pilha
%endif
segment _STACK STACK class=STACK align=16
resb %1
TOPO_DA_PILHA:
%endmacro
%macro .DATA 0
segment _DATA class=DATA align=2
%endmacro
%macro RETURN 1
mov ah, 0x4C
mov al,%1
int 0x21
%endmacro
%macro dosprint 1
push ax
push dx
mov dx,%1
mov ah,9
int 0x21
pop dx
pop ax
%endmacro
|
Agora veja dois exemplos de uso das macros acima, sendo o primeiro um programa do tipo .EXE, e o segundo um programa do tipo .COM criado a partir de arquivo objeto gerado pelo NASM:
EXEMPLO1.ASM
;EXEMPLO DE USO DAS MACROS DE MASM.INC
;Digite: nasm -fobj exemplo1.asm
;Digite: alink exemplo1 -oEXE
; ou tlink exemplo1;
;deve aparecer o arquivo exemplo1.exe
;--------------------------------------
%include "masm.inc"
.MODEL SMALL
.CODE
mov ax, @DATA
mov ds,ax
dosprint MENSAGEM
RETURN 0
.DATA
MENSAGEM DB "Testando Macros", "$"
.STACK 0x100
|
EXEMPLO2.ASM
;EXEMPLO DE USO DAS MACROS DE MASM.INC
;Digite: nasm -fobj exemplo2.asm
;Digite: tlink /t exemplo2;
;Deve ser entao produzido o executael exemplo2.com
;OBSERVACAO: Nasm e sensivel a maiusculas
; e minusculas (veja o manual)
;-----------------------------------------------
%include "masm.inc"
.MODEL TINY
.CODE
dosprint MENSAGEM
RETURN 0
.DATA
MENSAGEM DB "Testando Macros com programa .COM", "$"
|